home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
progtool
/
modula2
/
module
/
sounds.mod
< prev
next >
Wrap
Text File
|
1995-11-25
|
3KB
|
86 lines
IMPLEMENTATION MODULE Sounds;
FROM SYSTEM IMPORT VAL,ADR, SHIFT;
FROM XBIOS104 IMPORT GIRead,GIWrite,DoSound;
VAR i : CARDINAL;
(* Kanal 1..3 des Soundchips *)
PROCEDURE Wave(Kanal,Kurve,Dauer :CARDINAL);
VAR LowByte : BITSET;
BEGIN
IF (Kanal<4) AND (Kanal>0) THEN
GIWrite (8+Kanal-1,16); (* Lautstärke durch Hüllkurve gesteuert *)
LowByte:=VAL(BITSET,Dauer)*VAL(BITSET,0FFH);
GIWrite (13,Kurve);
GIWrite (11,VAL(CARDINAL,LowByte));
GIWrite (12,SHIFT(Dauer, - 8));
END(*IF*);
END Wave;
PROCEDURE Sound(Kanal,Periode:CARDINAL);
VAR LowByte : BITSET;
BEGIN
IF (Kanal<4) AND (Kanal>0) THEN
LowByte:=VAL(BITSET,Periode)*VAL(BITSET,0FFH);
GIWrite ((Kanal-1)*2,VAL(CARDINAL,LowByte)); (* Lowbyte *)
GIWrite ((Kanal-1)*2+1,SHIFT(Periode,- 8)); (* Highbyte *)
END(*IF*);
END Sound;
PROCEDURE Volume(Kanal,Vol:CARDINAL);
(* Werte von 0..15 möglich *)
BEGIN
IF (Kanal<4) AND (Kanal>0) THEN
Kanal:=Kanal-1+8;
GIWrite(Kanal,Vol);
END(*IF*);
END Volume;
PROCEDURE Noise(Hoehe:CARDINAL);
VAR Gesetzt : CARDINAL;
BEGIN
GIWrite(6,Hoehe); (* Nur Werte von 0..31 sinnvoll *)
END Noise;
PROCEDURE SetSoundAndNoise(NoiseChanels,SoundChanels:Chanel);
(* Mit NoiseChanels bzw SoundChanels wird angegeben *)
(* welche der Ton- oder Rauschkanäle ausgeschaltet !! *)
(* werden *)
(* Zu jedem Tonkanal kann Rauschen dazugemischt werden *)
VAR KanalFlag :CARDINAL;
BEGIN
KanalFlag:=0C0H; (* Bits 6 und 7 müssen gesetzt sein *)
KanalFlag:=KanalFlag+VAL(CARDINAL,SoundChanels); (* Bits 0,1,2 schalten Oszilatoren ein *)
KanalFlag:=KanalFlag+SHIFT(VAL(CARDINAL,NoiseChanels),3); (* Bit 3,4,5 gibt an ob ein *)
(* Rauschkanal dazugemischt wird *)
GIWrite(7,KanalFlag);
END SetSoundAndNoise;
PROCEDURE SoundAndNoiseOnOff(NoiseFlag,SoundFlag:CARDINAL);
(* Eigendlich dieselbe PROCEDURE wie SetSoundAndNoise *)
(* Nur das hier ein CARDINAL anstelle des SETs *)
(* übergeben wird. *)
(* KanalFlag := 0 => Kanal 1, 2 u. 3 an *) (*000*)
(* KanalFlag := 1 => Kanal 1 aus, 2 u. 3 an *) (*001*)
(* KanalFlag := 2 => Kanal 2 aus, 1 u. 3 an *) (*010*)
(* KanalFlag := 3 => Kanal 1 u. 2 aus, 3 an *) (*011*)
(* KanalFlag := 4 => Kanal 3 aus, 1 u. 2 an *) (*100*)
(* KanalFlag := 5 => Kanal 1 u. 3 aus, 2 an *) (*101*)
(* KanalFlag := 6 => Kanal 3 u. 2 aus, 1 an *) (*110*)
(* KanalFlag := 7 => Kanal 1, 2 u. 3 aus *) (*111*)
VAR KanalFlag :CARDINAL;
BEGIN
IF (NoiseFlag<8) AND (SoundFlag<8) THEN (* Nur keinen Unsinn hineinschreiben!*)
KanalFlag:=0C0H; (* Bits 6 und 7 müssen gesetzt sein *)
KanalFlag:=KanalFlag+SoundFlag; (* Bits 0,1,2 schalten Oszilatoren ein *)
KanalFlag:=KanalFlag+SHIFT(NoiseFlag,3); (* Bit 3,4,5 gibt an ob ein *)
(* Rauschkanal dazugemischt wird *)
GIWrite(7,KanalFlag);
END(*IF*);
END SoundAndNoiseOnOff;
END Sounds.